<?php

namespace app\api\controller;

use app\api\model\OrderCommon;

class Apple extends Common
{
    public function paypal()
    {
        $receipt_data = preg_replace('/\s/', '+', input('post.apple_receipt'));
        $out_trade_no = input('post.order');

        try {
            $result = $this->validate_apple_pay($receipt_data);

            if ($result['status']) {
                OrderCommon::notify($out_trade_no);
            } else {
                return $this->miss($result['message']);
            }
        } catch (\Exception $e) {
            return $this->miss($e->getMessage());
        }
        return $this->return['common.success.default'];
    }

    /**
     * 验证AppStore内付
     * @param string $receipt_data 付款后凭证
     * @return array 验证是否成功
     */
    private function validate_apple_pay($receipt_data)
    {
        // 验证参数
        if (strlen($receipt_data) < 20) {
            return array(
                'status' => false,
                'message' => '非法参数'
            );
        }
        // 请求验证
        $html = $this->acurl($receipt_data);
        $data = json_decode($html, true);
        // 如果是沙盒数据 则验证沙盒模式
        if ($data['status'] == '21007') {
            // 请求验证
            $html = $this->acurl($receipt_data, 1);
            $data = json_decode($html, true);
            $data['sandbox'] = '1';
        }

        if (isset($_GET['debug'])) {
            exit(json_encode($data));
        }

        // 判断是否购买成功
        if (intval($data['status']) === 0) {
            $order = $data['receipt']['in_app'];//所有的订单的信息
            $k = count($order) - 1;
            $need = $order[$k];//需要的那个订单
            $result = [
                'status' => true,
                'message' => '购买成功',
                'product_id' => substr($need['product_id'], 19),  //商品价格
                'transaction_id' => $need['transaction_id']  //苹果订单号
            ];
        } else {
            $result = [
                'status' => false,
                'message' => '购买失败 status:' . $data['status']
            ];
        }
        return $result;
    }

    /**
     *  0    receipt provided is valid.
     * 21000 App Store不能读取你提供的JSON对象
     * 21002 receipt-data域的数据有问题
     * 21003 receipt无法通过验证
     * 21004 提供的shared secret不匹配你账号中的shared secret
     * 21005 receipt服务器当前不可用
     * 21006 receipt合法，但是订阅已过期。服务器接收到这个状态码时，receipt数据仍然会解码并一起发送
     * 21007 receipt是Sandbox receipt，但却发送至生产系统的验证服务
     * 21008 receipt是生产receipt，但却发送至Sandbox环境的验证服务
     */
    private function acurl($receipt_data, $sandbox = 0)
    {
        //小票信息
        $POSTFIELDS = json_encode(["receipt-data" => $receipt_data]);

        //正式购买地址 沙盒购买地址
        $url_buy = "https://buy.itunes.apple.com/verifyReceipt";
        $url_sandbox = "https://sandbox.itunes.apple.com/verifyReceipt";
        $url = $sandbox ? $url_sandbox : $url_buy;

        //简单的curl
        $ch = curl_init($url);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($ch, CURLOPT_POST, 1);
        curl_setopt($ch, CURLOPT_POSTFIELDS, $POSTFIELDS);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);  //这两行一定要加，不加会报SSL 错误
        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
        $result = curl_exec($ch);
        curl_close($ch);
        return $result;
    }
}
